package com.cz.jar;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.file.FileNameUtil;
import cn.hutool.core.lang.Console;

import java.io.File;
import java.io.IOException;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import java.util.stream.Collectors;

public class JarFileSearcher {

    /**
     * 在指定目录下的所有JAR包中查找是否存在特定文件。
     *
     * @param directoryPath 要搜索的目录路径
     * @param fileNameToFind 要查找的文件名 (精确匹配，大小写敏感)
     * @return 如果找到文件，则返回包含该文件的JAR包的绝对路径；否则返回 null。
     */
    public static String findFileInJars(String directoryPath, String fileNameToFind) {
        // 1. 使用Hutool递归遍历目录下的所有文件
        for (File file : FileUtil.loopFiles(directoryPath)) {
            // 2. 判断是否为JAR文件
            if (file.isFile() && file.getName().toLowerCase().endsWith(".jar")) {
                Console.log("正在扫描JAR包: {}", file.getName());
                try (JarFile jarFile = new JarFile(file)) {
                    // 3. 遍历JAR包内的所有条目(entries)
                    for (JarEntry entry : jarFile.stream().collect(Collectors.toList())) {
                        // 获取条目名称，注意路径分隔符是'/'
                        String entryName = entry.getName();

                        // 我们可以根据需求进行不同方式的匹配
                        // 方式一: 精确匹配完整路径 (例如: "com/mysql/cj/jdbc/Driver.class")
                        if (entryName.equals(fileNameToFind)) {
                            Console.log("成功找到文件 '{}' 路径: {} 在JAR包: {}", fileNameToFind, entryName,file.getAbsolutePath());
                            return file.getAbsolutePath();
                        }

                        // 方式二: 只匹配文件名 (例如: "Driver.class")
                        String simpleFileName = new File(entryName).getName();

                        //System.out.println(simpleFileName);
                        if(simpleFileName.indexOf(".jsp") != -1){
                            System.out.println("jps文件："+simpleFileName);
                        }
                        if (simpleFileName.contains(fileNameToFind)) {
                            Console.log("成功找到文件 '{}' 路径: {} 在JAR包: {}", fileNameToFind,entryName,file.getAbsolutePath());
                            return file.getAbsolutePath();
                        }
                    }
                } catch (IOException e) {
                    Console.error("读取JAR文件 '{}' 出错: {}", file.getName(), e.getMessage());
                }
            }
        }
        // 遍历完所有JAR包都未找到
        return null;
    }

    public static void main(String[] args) {
        // --- 请修改为您的实际路径 ---
        String searchDirectory = "E:\\lanlin\\SPRJ20230804_MLZ\\WebContent\\WEB-INF\\lib"; // 要搜索的文件夹路径
        String targetFileName = "SysCfgProfileConfig";       // 要查找的文件名
        // 如果想找完整路径的文件，可以这样写：
        // String targetFileName = "com/mysql/cj/jdbc/Driver.class";

        System.out.println("开始在目录 '" + searchDirectory + "' 下的所有JAR包中查找文件 '" + targetFileName + "'...");

        String foundInJar = findFileInJars(searchDirectory, targetFileName);

        if (foundInJar != null) {
            System.out.println("\n查找结束: 文件已找到！");
            System.out.println("文件 '" + targetFileName + "' 存在于JAR包: " + foundInJar);
        } else {
            System.out.println("\n查找结束: 在所有JAR包中均未找到文件 '" + targetFileName + "'。");
        }
    }
}